#include<iostream>
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>

void handler(int signo)
{
    //非阻塞循环式回收子进程
    while(true)
    {
        pid_t rid = waitpid(-1,NULL, WNOHANG);
        if(rid>0)
        {
            printf("%d 进程， 收到了信号: %d , 回收子进程：%d\n" , getpid() , signo, rid);
        }
        else if(rid < 0) break;
        else break;
    }
}

// int main()
// {
//     // chdir("/home/zjx/Test");
//     // FILE* fp = fopen("hello.txt" , "w");
//     // signal(SIGINT , handler);
//     signal(SIGCHLD , handler);
//     pid_t id = fork();
//     if(id == 0)
//     {
//         sleep(3);
//         exit(3);//子进程退出
//         //子进程在终止的时候回向父进程发送SIGCHLD信号，该信号的默认处理动作为忽略
//     }
//     pid_t pid = getpid();
//     while(true)
//     {
//         // std::cout << "i am a process: " << getpid() << td::endl;
//         sleep(1); 
//     }
//     return 0;
// }

//使用signal
// void sigcb(int signo)
// {
//     std::cout << "捕捉到一个信号：" <<signo << std::endl;
//     exit(0);
// }

void sigcb(int signo)
{
    std::cout << "捕捉到一个信号：" <<signo << std::endl;
    sleep(2);
    exit(0);
}

int main()
{
    //对2号信号做自定义捕捉
    // signal(SIGINT , sigcb);
    //使用sigaction
    struct sigaction act ,oact;
    act.sa_handler = sigcb;//方法
    act.sa_flags = 0;//默认为0
    sigemptyset(&(act.sa_mask));
    //对2号信号做自定义捕捉
    sigaction(SIGINT , &act , &oact);

    while(true)
    {
        std::cout << "我是一个进程：" << getpid() << std::endl;
        sleep(1);
    }
    return 0;
}